<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>名称解析规则</title>

 </head>
 <body><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="language.namespaces.fallback.html">使用命名空间：后备全局函数/常量</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="language.namespaces.faq.html">FAQ: things you need to know about namespaces</a></div>
 <div class="up"><a href="language.namespaces.html">命名空间</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div><hr /><div id="language.namespaces.rules" class="sect1">
  <h2 class="title">名称解析规则</h2>
  <p class="para">
   在说明名称解析规则之前，我们先看一些重要的定义：
   <dl>

    <strong class="title">命名空间名称定义</strong>
    
     <dt>
非限定名称Unqualified name</dt>

     <dd>

      <p class="para">
       名称中不包含命名空间分隔符的标识符，例如 <em>Foo</em>
      </p>
     </dd>

    
    
     <dt>
限定名称Qualified name</dt>

     <dd>

      <p class="para">
       名称中含有命名空间分隔符的标识符，例如 <em>Foo\Bar</em>
      </p>
     </dd>

    
    
     <dt>
完全限定名称Fully qualified name</dt>

     <dd>

      <p class="para">
       名称中包含命名空间分隔符，并以命名空间分隔符开始的标识符，例如 <em>\Foo\Bar</em>。
       <em>namespace\Foo</em> 也是一个完全限定名称。
      </p>
     </dd>

    
   </dl>

  </p>
  <p class="para">
   名称解析遵循下列规则：
   <ol type="1">
    <li class="listitem">
     <span class="simpara">
      对完全限定名称的函数，类和常量的调用在编译时解析。例如 
      <em>new \A\B</em> 解析为类 <em>A\B</em>。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
     所有的非限定名称和限定名称（非完全限定名称）根据当前的导入规则在编译时进行转换。例如，如果命名空间
     <em>A\B\C</em> 被导入为 <em>C</em>，那么对 <em>C\D\e()</em> 
     的调用就会被转换为 <em>A\B\C\D\e()</em>。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
     在命名空间内部，所有的没有根据导入规则转换的限定名称均会在其前面加上当前的命名空间名称。例如，在命名空间 
     <em>A\B</em> 内部调用 <em>C\D\e()</em>，则 <em>C\D\e()</em> 
     会被转换为 <em>A\B\C\D\e()</em> 。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
     非限定类名根据当前的导入规则在编译时转换（用全名代替短的导入名称）。例如，如果命名空间
     <em>A\B\C</em> 导入为C，则 <em>new C()</em>
     被转换为 <em>new A\B\C() </em>。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      在命名空间内部（例如A\B），对非限定名称的函数调用是在运行时解析的。例如对函数
      <em>foo()</em> 的调用是这样解析的：
     </span>
      <ol type="1">
       <li class="listitem">
        <span class="simpara">
         在当前命名空间中查找名为 <em>A\B\foo()</em> 的函数
        </span>
       </li>
       <li class="listitem">
        <span class="simpara">
        尝试查找并调用 <em class="emphasis">全局(global)</em> 空间中的函数 <em>foo()</em>。
        </span>
       </li>
      </ol>
    </li>
    <li class="listitem">
     <span class="simpara">
      在命名空间（例如<em>A\B</em>）内部对非限定名称或限定名称类（非完全限定名称）的调用是在运行时解析的。下面是调用
      <em>new C()</em> 及 <em>new D\E()</em> 的解析过程：
      <em> new C()</em>的解析:
     </span>
     <ol type="1">
      <li class="listitem">
       <span class="simpara">
        在当前命名空间中查找<em>A\B\C</em>类。
       </span>
      </li>
      <li class="listitem">
       <span class="simpara">
        尝试自动装载类<em>A\B\C</em>。
       </span>
      </li>
     </ol>
     <span class="simpara">
      <em> new D\E()</em>的解析:
     </span>
     <ol type="1">
      <li class="listitem">
       <span class="simpara">
        在类名称前面加上当前命名空间名称变成：<em>A\B\D\E</em>，然后查找该类。
       </span>
      </li>
      <li class="listitem">
       <span class="simpara">
        尝试自动装载类 <em>A\B\D\E</em>。
       </span>
      </li>
     </ol>
     <span class="simpara">
      为了引用全局命名空间中的全局类，必须使用完全限定名称 <em>new \C()</em>。
     </span>
    </li>
   </ol>
  </p>
  <div class="example" id="example-252">
   <p><strong>Example #1 名称解析示例</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">namespace&nbsp;</span><span style="color: #0000BB">A</span><span style="color: #007700">;<br />use&nbsp;</span><span style="color: #0000BB">B</span><span style="color: #007700">\</span><span style="color: #0000BB">D</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">C</span><span style="color: #007700">\</span><span style="color: #0000BB">E&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">F</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">//&nbsp;函数调用<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;首先尝试调用定义在命名空间"A"中的函数foo()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;再尝试调用全局函数&nbsp;"foo"<br /><br /></span><span style="color: #007700">\</span><span style="color: #0000BB">foo</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;调用全局空间函数&nbsp;"foo"&nbsp;<br /><br /></span><span style="color: #0000BB">my</span><span style="color: #007700">\</span><span style="color: #0000BB">foo</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;调用定义在命名空间"A\my"中函数&nbsp;"foo"&nbsp;<br /><br /></span><span style="color: #0000BB">F</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;首先尝试调用定义在命名空间"A"中的函数&nbsp;"F"&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;再尝试调用全局函数&nbsp;"F"<br /><br />//&nbsp;类引用<br /><br /></span><span style="color: #007700">new&nbsp;</span><span style="color: #0000BB">B</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;创建命名空间&nbsp;"A"&nbsp;中定义的类&nbsp;"B"&nbsp;的一个对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果未找到，则尝试自动装载类&nbsp;"A\B"<br /><br /></span><span style="color: #007700">new&nbsp;</span><span style="color: #0000BB">D</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;使用导入规则，创建命名空间&nbsp;"B"&nbsp;中定义的类&nbsp;"D"&nbsp;的一个对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果未找到，则尝试自动装载类&nbsp;"B\D"<br /><br /></span><span style="color: #007700">new&nbsp;</span><span style="color: #0000BB">F</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;使用导入规则，创建命名空间&nbsp;"C"&nbsp;中定义的类&nbsp;"E"&nbsp;的一个对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果未找到，则尝试自动装载类&nbsp;"C\E"<br /><br /></span><span style="color: #007700">new&nbsp;\</span><span style="color: #0000BB">B</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;创建定义在全局空间中的类&nbsp;"B"&nbsp;的一个对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果未发现，则尝试自动装载类&nbsp;"B"<br /><br /></span><span style="color: #007700">new&nbsp;\</span><span style="color: #0000BB">D</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;创建定义在全局空间中的类&nbsp;"D"&nbsp;的一个对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果未发现，则尝试自动装载类&nbsp;"D"<br /><br /></span><span style="color: #007700">new&nbsp;\</span><span style="color: #0000BB">F</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;创建定义在全局空间中的类&nbsp;"F"&nbsp;的一个对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果未发现，则尝试自动装载类&nbsp;"F"<br /><br />//&nbsp;调用另一个命名空间中的静态方法或命名空间函数<br /><br /></span><span style="color: #0000BB">B</span><span style="color: #007700">\</span><span style="color: #0000BB">foo</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;调用命名空间&nbsp;"A\B"&nbsp;中函数&nbsp;"foo"<br /><br /></span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;调用命名空间&nbsp;"A"&nbsp;中定义的类&nbsp;"B"&nbsp;的&nbsp;"foo"&nbsp;方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果未找到类&nbsp;"A\B"&nbsp;，则尝试自动装载类&nbsp;"A\B"<br /><br /></span><span style="color: #0000BB">D</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;使用导入规则，调用命名空间&nbsp;"B"&nbsp;中定义的类&nbsp;"D"&nbsp;的&nbsp;"foo"&nbsp;方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果类&nbsp;"B\D"&nbsp;未找到，则尝试自动装载类&nbsp;"B\D"<br /><br /></span><span style="color: #007700">\</span><span style="color: #0000BB">B</span><span style="color: #007700">\</span><span style="color: #0000BB">foo</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;调用命名空间&nbsp;"B"&nbsp;中的函数&nbsp;"foo"&nbsp;<br /><br /></span><span style="color: #007700">\</span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;调用全局空间中的类&nbsp;"B"&nbsp;的&nbsp;"foo"&nbsp;方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果类&nbsp;"B"&nbsp;未找到，则尝试自动装载类&nbsp;"B"<br /><br />//&nbsp;当前命名空间中的静态方法或函数<br /><br /></span><span style="color: #0000BB">A</span><span style="color: #007700">\</span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;调用命名空间&nbsp;"A\A"&nbsp;中定义的类&nbsp;"B"&nbsp;的&nbsp;"foo"&nbsp;方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果类&nbsp;"A\A\B"&nbsp;未找到，则尝试自动装载类&nbsp;"A\A\B"<br /><br /></span><span style="color: #007700">\</span><span style="color: #0000BB">A</span><span style="color: #007700">\</span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();&nbsp;&nbsp;</span><span style="color: #FF8000">//&nbsp;调用命名空间&nbsp;"A\B"&nbsp;中定义的类&nbsp;"B"&nbsp;的&nbsp;"foo"&nbsp;方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果类&nbsp;"A\B"&nbsp;未找到，则尝试自动装载类&nbsp;"A\B"<br /></span><span style="color: #0000BB">?&gt;</span>
</span>
</code></div>
   </div>

  </div>
 </div><hr /><div class="manualnavbar" style="text-align: center;">
 <div class="prev" style="text-align: left; float: left;"><a href="language.namespaces.fallback.html">使用命名空间：后备全局函数/常量</a></div>
 <div class="next" style="text-align: right; float: right;"><a href="language.namespaces.faq.html">FAQ: things you need to know about namespaces</a></div>
 <div class="up"><a href="language.namespaces.html">命名空间</a></div>
 <div class="home"><a href="index.html">PHP Manual</a></div>
</div></body></html>
